package com.mazaiting

import java.io.BufferedReader
import java.io.File
import java.io.FileOutputStream
import java.io.FileReader
import java.net.URL
import java.util.concurrent.Executors

/**
 * 图片下载器
 */
object PictureDownload {
    /** 图片路径 */
    private val dir = "${File("").absolutePath}/pic"
    /** 图片文件夹 */
    private var fileDir = File(dir)
    /** 线程池 */
    private val executors = Executors.newFixedThreadPool(5)

    @JvmStatic
    fun main(args: Array<String>?) {
        // 获取文件名
        val fileName =
                if (args != null && args.size == 1) {
                    args[0]
                } else {
                    "test.txt"
                }
        // 创建文件
        val file = File(fileName)
        // 判断文件是否存在
        if (file.exists()) {
            // 判断路径存在并且是路径
            if (fileDir.exists()) {
                if (fileDir.isDirectory) {
                    fileDir = File("${dir}_${System.currentTimeMillis()}")
                }
            }
            // 创建路径
            fileDir.mkdir()
            // 创建字符读取器
            val br = BufferedReader(FileReader(file))
            // 读取一行
            var str = br.readLine()
            // 循环读取
            while (str != null) {
                // 去除字符串中的空格
                str = str.trim()
                // 判断字符串是否为空
                if (str != "") {
                    // 判断是否![开始
                    if (str.startsWith("![")) {
                        downloadPic(str, fileDir.absolutePath)
                    }
                }
                // 读取下一行
                str = br.readLine()
            }
        } else {
            println("解析异常, 文件不存在")
        }
    }

    /**
     * 下载图片
     * @param str 当前行内容
     * @param fileDir 图片路径
     */
    private fun downloadPic(str: String, fileDir: String) {
        // 获取第一个]标识位置
        val endIndex = str.indexOf(']')
        // 截取文件名
        val picName = str.substring(2, endIndex)
        // 获取下载路径
        val url = str.substring(endIndex + 2, str.length - 1)
        // 线程池
        executors.submit {
            // 打开网络链接
            val conn = URL(url).openConnection()
            // 获取输入流
            val inputStream = conn.getInputStream()
            // 创建文件输出流
            val fos = FileOutputStream(File(fileDir, picName))
            // 创建字节缓冲数组
            val bytes = ByteArray(1024)
            // 定义读取文件长度
            var len = inputStream.read(bytes)
            // 循环读取写入
            while (len != -1) {
                // 写入文件
                fos.write(bytes, 0, len)
                // 读取文件
                len = inputStream.read(bytes)
            }
            // 关闭流
            fos.close()
            inputStream.close()
            println("$picName 下载完成")
        }
    }
}